#include<thread>
#include<iostream>

using namespace std;

struct func
{
private: 
        int& i;
public:
    func(int& i_) : i(i_) {}
    void operator() ()
    {
        for (unsigned j=0 ; j<1000000 ; ++j)
        {
            do_something(i);           // 1 潜在访问隐患：悬空引用
        }
    }
    void do_something(int &i){
        if(i % 100 == 0)
            cout << i << endl;
    }
};

void oops()
{
  int some_local_state=0;
  // 新线程引用了老线程的int类型变量
  func my_func(some_local_state);
  std::thread my_thread(my_func);
  my_thread.detach();          // 2 不等待线程结束
}                              // 3 新线程可能还在运行

// Java就没有这个困扰(悬空引用)，因为Java中只有值传递，没有引用传递。
// 对于基本类型参数传递时，Java线程在本地栈中开辟空间空间保存。
// 对于类类型，Java在栈中只存储类对象的引用，类对象的实体在堆中。

int main(){
    oops();
    return 0;
}